do while是一个常见的约定,它使得宏需要像标准c函数一样的尾随半冒号.除此之外,它只是确保已释放的变量设置为NULL,以便将来任何释放它的调用都不会导致错误.
do { stuff() } while(0);
正在做与stuff()完全相同的事情.那么有什么大不了的呢?问题在于宏的语法.假设我们将宏定义为:
#define SAFE_FREE(x) if ((x) != NULL) { free(x); x=NULL; }
然后,有两个问题.第一个是相对较小的:使用SAFE_FREE不再需要尾部分号.更重要的是,代码如下:
if (...) SAFE_FREE(x) else stuff();
将扩展为:
if (...) if ((x) != NULL) { free(x); x = NULL; } else stuff();
如上所述定义宏可以防止出现如上所述的奇怪行为,因为do { ... } while(0)
行为就像没有分号的语句一样.
do while是一个常见的约定,它使得宏需要像标准c函数一样的尾随半冒号.除此之外,它只是确保已释放的变量设置为NULL,以便将来任何释放它的调用都不会导致错误.